u, v = var('u v')
d = vector([sin(u), cos(u), 0])
show(d)
parametric_plot3d(d, (u, -pi, pi/2))
Ojo todas las graficas que generó esta hoja se pueden mover para cambiar la vista, solo hay que dar click y arrastrar.
Otro ejemplo, esta vez con una superfície. Como se puede ver no es muy difícil hacer la parametrización usando las expresiones vectoriales.
e = vector([0,0,1])
r = e*sin(v)+d*cos(v)
show("$$r(v) = e_3 \\sin(v)+d \\cos(v) = $$")
show(r)
show(" $$ s(u,v) = R_1 d(u) + R_2 r(v) $$")
parametric_plot3d(2*d+0.5*r, (u, -pi, pi),(v,-pi, pi))
Ahora con colores
def pinta(u,v): return (1-cos(u+v))/2
parametric_plot3d(2*d+0.5*r, (u, -pi, pi),(v,-pi, pi),
color=(pinta,colormaps.cubehelix),
plot_points=[120,120])
Se puede crear una coloración como dice en el manual de matplotlib
para definir el espacio de colores, interpolamos 128 puntos entre los elementos de la paleta.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
completo = []
npaleta = [[0,0,0.5, 0.7],[0,0.5,0, 0.7], [0.5,0,0,0.7]]
parte1 = np.linspace(start=npaleta[0], stop=npaleta[1],num=128)
parte2 = np.linspace(start=npaleta[1], stop=npaleta[2],num=128)
completo = np.append(parte1, parte2, 0)
clrs = ListedColormap(completo)
def pinta(u,v): return (1+cos(u+v))/2
S = parametric_plot3d(2*d+0.5*r, (u, -pi, pi),(v,-pi, pi),
color=(pinta,clrs),
plot_points=[120,120])
S.show()
Podríamos definir una curva paramétrizada sobre esa superficie, en este caso vamos a usar el parámetro real $t$ $$ u= \frac{t}{2} \qquad v = 3t$$ $$ p = s(\frac{t}{2}, 3t)$$
t = var('t')
p= (2*d+r/2)(u=t/2, v= 3*t)
show(p)
p= (2*d+r/1.9)(u=t/2, v= 3*t) # para que no se oculte dentro de la superficie
C = parametric_plot3d(p, (t, -pi, pi), thickness='3.0')
show(C+S)
En sage se pueden manejar diferentes clases de funciones y otros objetos matemáticos. por mencionar uno; los campos vectoriales se pueden usar como objetos concretos. En los siguientes ejemplos definimos una curva y su campo de tangentes. Como muestra de la practicidad de sage, podríamos calcular el campo de vectores normales a la curva y tangentes a la superficie.
E.<x,y,z> = EuclideanSpace()
p= (2*d+r/2)(u=t/2, v= 3*t)
T_p = E.vector_field(p.diff(t),name='T_p')
F_r = E.vector_field(r(u=t/2, v=3*t))
N_p = T_p.cross(F_r)
show(T_p[:])
show(F_r[:])
cC = E.curve([*p],t)
nC = N_p.along(cC)
gN = nC.plot(E.cartesian_coordinates(), ranges={t: (-pi, pi)}, number_values= 21)
gC = cC.plot(prange=(-pi, pi))
(gN+C+S).show()
Se pueden dar cuenta de que en esta página no se pueden cambiar los cálculos, esto es por que solo es el resultado exportado a html, pero si quieren experimentar pueden bajar el código original en esta dirección. También le faltan muchas explicaciones, pero toda la documentación necesaria la podrán encontrar en los manuales de sagemath
Lo mas recomendable es siempre buscar en los foros de preguntas relacionadas con lo que uno piensa hacer, leer algunos conceptos de la documentación y/o en artículos del Arxiv.